常见错误排查

xiaoxiao2021-02-28  59

这几天学习的东西比较散乱,所以写的东西不会太系统,想到什么就写什么了,只为了自己以后再遇到的时候可以快速的翻看一下。

1. jdk和jre环境变量配置问题:

JDK(java_home)的路径配置是配置到JDK的目录,不能配置到JDK\BIN目录,虽然配置到JDK\BIN目录同样可以运行javac和java -version命令,但是大多数环境配置的CLASS-PATH借用了JAVA_HOME的路径,所以在运行tomcat时会导致tomcat无法启动;

2.Servlet url-pattern配置:

url-pattern表示一种匹配规则,常见的配置参数有路径配置(/package/rule)和文件配置(/package/*.jsp或者/package/*.html),表示的含义是URL提交的请求符合哪一种规则,就会去调用哪一个servlet,规则是用户自己定义的。

servlet的线程安全性:如果一个servlet定义了一个成员变量并对其进行操作,那么就会出现在多个请求同时调用servlet时对成员变量进行多次修改,造成线程潜在的危险,为了避免这种危险,需要考虑:1.尽量使用局部变量;2.使用同步块Synchronized,一个一个排队请求,性能很低,不提倡;3.实现 SingleThreadModel 接口,即给每个请求分配一个新的实例,每个实例操作的是自己的变量,但是这样就引起了大量的系统开销,不提倡

3.标识接口:没有定义任何方法和属性的接口比如java.io.Serializable和java.rmi.Remote,以下转载一个高人的例子说明:

这是昨天我跟天意在一次闲聊中一次有起的讨论,标签接口真有那么重要吗?比如说很多初学者认为java.io.Serializable这样的接口,很多时候可用可不用,不用一样能执行对象系列化功能。   为此,我们通过一个通俗而有趣的示例!这个示例是设计一个猎人,其持有一把智能猎枪,这就是说这把猎枪会自动识别人类,若发现瞄准的目标是人类,就不会开火,而其它的任何事物都通杀。   为此,我们使用了下面三个接口:   一个用来表示万事万物的SomeThing        public interface SomeThing {}  

  人类的接口:   public interface Humans extends SomeThing {}

  动物的接口: public interface Animals extends SomeThing {}

然后是一系列的实现:     中国人:       public class Chinese implements Humans {}    日本人: public class Japanese {}

   狗: public class Dog implements Animals {}

妖怪(他很聪明,给自己帖上了人的标签): public class Monster implements Humans {}

下面这个程序的核心部分,猎人类及客户端程序: public class Hunter { public void fire(Object target) {  if(target instanceof Humans)  {   System.out.println("这下完了,打中了一个人,该去坐牢了!");  }  else   {   System.out.println("恭喜你,打中了一只动物!");  } } //智能的枪 public void intelligentFire(Object target) {  if(target instanceof Humans)  {   return;  }  System.out.println("开了一枪!"+target.getClass());  //下面进行秒杀等相关处理  //销毁他  target=null; } public static void main(String[] args) { Hunter hunter=new Hunter(); Object[] objects=new Object[]{new Dog(),new Japanese(),new Japanese(),new Chinese(),new Monster(),new SomeThing(){}}; for(int i=0;i<objects.length;i++)  hunter.intelligentFire(objects[i]); } }

 运行程序,你会发现输出类似下面结果:

开了一枪!class springroad.demo.taginterface.Dog 开了一枪!class springroad.demo.taginterface.Japanese 开了一枪!class springroad.demo.taginterface.Japanese 开了一枪!class springroad.demo.taginterface.Hunter$1

  由此可见,智能猎枪瞄准6个目标,开了4枪。只对Chinese、及Monster的实例没有开枪。因为这里讨论的是标签接口,虽然Humans没有任何方法,但从智能猎枪的角度来看,他就是通过这个标签来判断是否可以开火的。他不用管也管不了目标的层次等级关系(比如Japanese肯定很非常鲜明等级结构),即继承关系。他也管不了目标的来自于哪儿。比如,是用new操作符创建,还是从容器中取,或者是从网络某个地方加载一个。   Hunter只是制订了一个简单的规则,你要想不让我的枪对你开火,你就必须在自己身上帖上一个Humans的标签。也就是说你必须遵守这个规则。   现在回过头来看,因为妖怪Monster真身应该是一条蛇或其它什么动物,但是他懂得Hunter制订的规则,于在巧妙的给自己帖上了一个Humans的标签,以致于欺骗了我们的智能猎枪。   而Japanese则自认为自己了不起,不按规则办事,我就不理你Hunter制订的规则,什么Humans标签,我就是不用。于是放到我们的程序中当然就只有挨杀的份了。

  由此可见,空接口(标签接口)的重要性,在像本例中,给不给自己帖上标签,这是一个性命莜关的问题。其实在OO的世界中,空接口可以算是最高的层像。

转载请注明原文地址: https://www.6miu.com/read-46515.html

最新回复(0)