编译器明明可以确定为错误,为什么只报出警告或任何警告错误都不报出?

问题描述

packagecom.test;publicclassTest2{publicstaticvoidmain(String[]args){methodA();}publicstaticvoidmethodA(){//行1Strings=null;//行2System.out.println(s.length());//这一行报一个警告:Nullpointeraccess:Thevariablescanonlybenullatthislocation}}疑问1:多个地方调用Test2类的methodA()方法,都是各自的methodA()方法,对吗?会互不影响,里面的局部变量s都会是各自的,对吗?为什么?在底层原理上如何解释?疑问2:为什么编译器只给出一个警告而不是错误呢?我认为用人为的方法也没有任何办法使在执行“行2”语句时s变量不为null,即是说:s变量一定为null,对吗?如果是这样,那编译器就应该报错,而不应该是警告啊,对吗?编译器为什么设计成只报警告而不是错误呢?是编译器做的粗糙不细的原因吗?下面还有一个例子,请注意看注释处,那里描述的是运行的结果:publicstaticvoidmain(String[]args){Listlist=newArrayList();list=null;for(Objects:list){//编译不报错,运行时,这行会报错:java.lang.NullPointerExceptionSystem.out.println(111111);}System.out.println(222222);}------------------------------------------疑问3:再看下面代码:packagecom.test;publicclassTest2{publicstaticvoidmain(String[]args){methodA();}publicstaticvoidmethodA(){Objecta=newInteger(3);//行1Strings=(String)a;//行2System.out.println(s);}}上面代码编译器没有报出任何的错误和警告。a变量中实际装的类型是Integer,到“行2”代码时,编译器一定能够有办法知道a变量中的实际类型,并且人为也没有任何办法使程序运行到“行2”时使a变量中的数据类型变成非Integer,因为这是在一个方法中,那么编译器为什么不在“行2”就报错呢?而使在运行时报了错?------------------------------------------疑问4:packagecom.test;publicclassTest3{publicstaticvoidmain(String[]args){inta=test();System.out.println(a);}privatestaticinttest(){inta=20/0;//行1System.out.println(a);//行2return0;}}上面代码,编译正常,没有报出任何的警告和错误,我的疑问:编译器为什么不在“行1”处报错误呢?而编译器是能够检测到这一行运行的时候一定会出错啊,我认为没有任何办法使“inta=20/0;”这行语句在运行时变化而使之不报错,对吗?那编译器为什么不使在编译的时候就使在“行1”处报错呢?

解决方案

解决方案二:
1、你这个说法有点小问题,methodA由于是static,所以永远只有一个,但是如果多个地方调用methodA,他们的运行环境确实是独立的不同的,也就是说有独立的栈内存,局部变量也当然是不同的,这个去看函数调用原理就知道了。234属于同一问题,这只是编译器设计上的问题,不同编译器表现可能不同,你完全可以自己写一个Java编译器检查所有明显错误的情况并报错不予以编译,或者你也可以写一个编译器完全不检查任何潜在错误。当前版本的官方编译器设计上认为编译器的本职工作只是编译,运行会不会出错和它无关,它在能编译通过的情况下尽量编译,除非是实在无法编译才会报告错误,如果它觉得这个代码可能有问题但可以编译通过,也只会警告,就算在你看来肯定会出错,编译器也是睁一只眼闭一只眼,这一方面是充分相信程序员,另一方面也是效率上的考虑,这类错误太多了,如果所有这些错误你都要去检查,并且做出适当处理,那开销太大,特别是大型项目编译,如果一个项目本来编译只需要一分钟,检查错误却要花上十分钟,那估计没有几个人会喜欢这个编译器,所以有些语言比如C/C++的某些编译器为了效率基本不会检查潜在错误。
解决方案三:
追问:疑问1中的代码:publicstaticvoidmethodA(){  //行1  Strings=null;  //行2  System.out.println(s.length());}疑问5:想尽一切的办法,是否有方法能够使在执行“行2”代码时,使s变量的值不为null?我想过多线程,但也认为无法做到,因为这是一个方法,是一个方法中的局部变量,每个线程执行此方法,都会是 “各自单独” 地去执行此方法。

时间: 2024-08-03 06:11:38

编译器明明可以确定为错误,为什么只报出警告或任何警告错误都不报出?的相关文章

登录事件-他说 = 附近有语法错误 找来找去不知道=有什么错误

问题描述 他说 = 附近有语法错误 找来找去不知道=有什么错误 //登录事件处理方法 private void button1_Click(object sender, EventArgs e) { try { string sql = string.Format("select uname,password,userrole from tb_userinfo where uname={0}", this.tb_name.Text.Trim()); DataSet ds = sqlHp

智能车-用IAR 编写K60程序,报出关于memory map的错误。

问题描述 用IAR 编写K60程序,报出关于memory map的错误. there has already included a memory map.Only one memory map can be included. 解决方案 http://wenku.baidu.com/link?url=zjVdhUXmEnn3kcGfoXTpp6jz3FqlC0J_VSoK4_c7SgkH7mO2EHqTxLb3bjWlV4iICiAP6uIuz3Vg6MPEBae9XOKVZuOrmXRCAA5

菜鸟求帮忙 php读取文本信息怎么只读取了一部分 代码和图都在

问题描述 菜鸟求帮忙 php读取文本信息怎么只读取了一部分 代码和图都在 求大神帮帮忙,帮我看看 到底是什么问题 解决方案 因为你的文件中有"<",php输出的内容会被当做html来解析,然后你文件中的<z就被当做html来解析了,所以就没有被输出,解决办法: echo htmlentities($html); 解决方案二: 有多余的标点符号,.

ios-应用报出了不兼容指针错误

问题描述 应用报出了不兼容指针错误 正在读取UTF8编写的txt文件. 代码: - (NSString *) readFromFile { NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory NSUserDomainMask YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *fileName = [NSStr

技术-求问:这个sql语句有什么错误,放在Oracle Sql Developer上运行错误,求解

问题描述 求问:这个sql语句有什么错误,放在Oracle Sql Developer上运行错误,求解 "" select t3.dwnvl(t4.adhf0)nvl(t4.ayhf0)nvl(t4.azl0)nvl(t4.cdhf0)nvl(t4.cyhf0)nvl(t4.czl0)""+ from ""+ (select '便民中心' as dw from dual union select '纪委' as dw from dual unio

数据结构-哈夫曼树运行错误 但调试却正确 一直找不成错误

问题描述 哈夫曼树运行错误 但调试却正确 一直找不成错误 估计问题是出在HuffmanCoding 但怎么都找不出来 #include "stdio.h" #include "stdlib.h" #include "string.h" char alphabet[]={'A','B','C','D'}; typedef struct { int weight; //权值 int parent; //父节点序号 int left ; int rig

VS2010中的WPF程序出现数组越界错误,程序直接终止,但为什么错误列表没有给出相应的提示?

问题描述 VS2010中的WPF程序出现数组越界错误,程序直接终止,但为什么错误列表没有给出相应的提示?每次都需要自己进行调试查问题出现在哪个位置,是我的VS设置有问题吗? 解决方案 解决方案二:你可以调试看看具体问题是在哪里解决方案三:但是我希望能够在错误列表中给出相应的错误提示信息,为什么会没有呢?我记得以前是用,刚开始学习C#,不太熟悉VS2010.引用1楼hefeng_aspnet的回复: 你可以调试看看具体问题是在哪里 解决方案四:运行状态程序crash的时候是直接跳出的,只有调试才给

服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止

原文:服务器上出现应用程序错误.此应用程序的当前自定义错误设置禁止 误设置禁止远程查看应用程序错误的详细信息(出于安全原因). 之前自己也碰到過這種情況.特此整理,希望能夠幫助有困惑的挨踢人士~ 说明: 服务器上出现应用程序错误.此应用程序的当前自定义错误设置禁止查看应用程序错误的详细信息. 详细信息: 若要使他人能够从本地服务器计算机上查看此特定错误信息的详细信息,请在位于当前 Web 应用程序根目录下的"web.config"配置文件中创建一个 <customErrors&g

duilib 修复padding属性导致其他控件自动计算宽高度错误的bug和导致自己宽高度错误的bug

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42950733          BUG 一:padding导致其他控件宽度计算错误             今天在写项目的一个布局时,用到了最常用的相对布局属性padding:在一个纵向容器里,给其中的各个子元素设置了padding属性来做相对布局.但是出现了很奇怪的现象:容器的最后一个元素本应该在最底部,但是实际却留出了一部分空白.          实际上这个bug