Java 了解Try-Catch块行为

Java 了解Try-Catch块行为,java,try-catch,Java,Try Catch,我在try-catch中遇到了一个奇怪的问题,这让我怀疑自己对异常处理基本原理的认识。按照基本语法 try{ code to be checked } catch(Exception e){} finally{} 然而,下面的代码给了我一个空指针异常,我认为应该捕获它 class Ideone { public static void main (String[] args) throws java.lang.Exception { try{

我在try-catch中遇到了一个奇怪的问题,这让我怀疑自己对异常处理基本原理的认识。按照基本语法

try{
      code to  be checked     
   }
catch(Exception e){}
finally{}
然而,下面的代码给了我一个空指针异常,我认为应该捕获它

class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{



    try{

            for(Model m: Null Collection coming from DB)
            System.out.println("Inner Block");

      System.out.println("Outer Block");        

    }catch(Exception e){}

}
}

我还没有初始化

public class Ideone{
public static void main (String[] args) throws java.lang.Exception
{

    int i = 0;

    try{ 


            if(i<2)
            System.out.println("Inner Block");

      System.out.println("Outer Block");        

    }catch(Exception e){}

}
}
公共类Ideone{
公共静态void main(字符串[]args)引发java.lang.Exception
{
int i=0;
试试{

如果(i你确定你的问题吗?我相信你的捕获中有一些清理代码尚未初始化-因此出现异常。如果你发布你的实际代码会有所帮助。 以下工作如预期:

import java.util.List;

public class Main {

public static void main(String[] args) {
    List i=null;
    try{
        for(Object o: i) {
            System.out.println("Inner Block");
        }
        System.out.println("Outer Block");
    }catch(Exception e){}
}
}无法复制。 我试过这个

public static void main (String[] args) throws java.lang.Exception
    {
        Collection c = null ;
        try{ 
            for(Object i:c)
                System.out.println("Inner Block");
            System.out.println("Outer Block");        
        }catch(Exception e){}
    }

它工作得很好。

下面的代码片段显示“异常!”

列表字符串=null;
试一试{
用于(字符串s:字符串){
系统输出打印项次;
}
}捕获(例外e){
System.out.println(“异常!”);
}
正如其他人所指出的,你自己也说过

您是否尝试过从头开始重新编译您的所有代码?在我的团队(250.000行代码库)中,使用eclipse时,我们有时会遇到错误编译的问题,这些错误编译可能会产生无法解释的问题。我们通常通过完全重新编译来解决这些问题

了解Try-Catch块行为

使用
try-catch
块的主要原因是处理代码出现问题或在正常情况下意外发生的事情,然后以某种方式抛出异常并在
catch
块中进行处理,
最后的
块几乎用于
关闭任何打开的流,并关闭它即使
try
catch
返回任何值(系统终止除外),每次都将在代码中运行

在您的代码中,似乎有一些东西是从数据库中获取的,它是
null
或尚未初始化,或者它已经从空值数据库中返回,现在您不能使用
null
对象,如果它尚未初始化!您必须确保它是否为
null
,然后像这样使用它:

class Ideone {
    public static void main(String[] args) throws java.lang.Exception {
        try {
            if(Null Collection coming from DB != null){
                for(Model m: Null Collection coming from DB)
                    System.out.println("Inner Block");
            }
            System.out.println("Outer Block");

        } catch (Exception e) {}
    }
}

is扩展了RuntimeException,当您尝试使用null对象时会抛出它。

集合为
null
。您不能在null对象上迭代collection@VinodMadyalkar问题是为什么它没有被捕获Block@amanshivhare-你怎么知道它没有被抓住?@VinodMadyalkar,因为我犯了个错误此时?进程:com.example.aman.navtest2,PID:6207 java.lang.NullPointerException为什么不在catch块中设置一个sysout来检查它是否被捕获?或者通过代码进行调试?如果更改了i=12,您知道会发生什么吗?尝试更改}catch(NullPointerException e){System.out.println(“nulls exist”};无论
i
是否初始化,此代码都不会给出NullPointerException,因为
i
是原始的。无论是否引发异常,它都会在控制台中打印“error”。它不会给我一个null指针异常,我删除最后一行可能尝试放置
System.out.println(“error”);
catch
块中,您将看到异常。我知道您的意思。但它确实可以捕获异常,而不是将其抛出。是的,如果出现异常,它将捕获异常。您关于它不提供空指针异常的声明完全是错误的:将抛出NPE,但您在没有给出任何指示的情况下将其吞下发生了什么。Runnsjo令人惊讶地解决了问题。(重建项目)
class Ideone {
    public static void main(String[] args) throws java.lang.Exception {
        try {
            if(Null Collection coming from DB != null){
                for(Model m: Null Collection coming from DB)
                    System.out.println("Inner Block");
            }
            System.out.println("Outer Block");

        } catch (Exception e) {}
    }
}