繁体   English   中英

Java:如何在try-catch -loop中访问作业?

[英]Java: how to access assignments in try-catch -loop?

这个问题让我陷入了巨大的try-catch循环。 我想要更小。 那么如何在循环中访问赋值?

$ javac TestInit2.java 
TestInit2.java:13: variable unknown might not have been initialized
  System.out.println(unknown);
                     ^
1 error

import java.util.*;
import java.io.*;

public class TestInit2 {

 public static void main(String[] args){
  String unknown;
  try{
   unknown="cannot see me, why?";
  }catch(Exception e){
   e.printStackTrace();
  }
  System.out.println(unknown);
 }
}

您需要将一个初始值分配给unknown (在这种情况下,我使用了null但随意分配任何对您的应用程序有意义的值):

import java.util.*;
import java.io.*;

public class TestInit2 {

    public static void main(String[] args){
        String unknown = null;
        try{
            unknown="cannot see me, why?";
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println(unknown);
    }
}

由于您的分配中发生try编译器无法验证的方式unknown永远不会被分配一个值,因此它是可能的,你可以使用这个变量没有分配的值。

编译器阻止你做一些很可能是错误的事情,因为在你的try-catch块之后,你可能会假设变量被初始化了。 但是,如果抛出异常,则不会初始化它。

在使用变量之前,您需要将变量赋值给它。 但是,如果要在赋值失败时将其指定为null,则可以将其指定为null。

因此,如果您希望变量在赋值失败时为null,请尝试以下操作:

    String unknown = null;
    try{
        unknown="cannot see me, why?";
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println(unknown);

如果要在捕获异常时将变量设置为其他内容,请尝试以下操作:

    String unknown;
    try{
        unknown="cannot see me, why?";
    }catch(Exception e){
        e.printStackTrace();
        unknown = "exception caught";
    }
    System.out.println(unknown);        

此外,如果在分配失败的情况下继续执行方法没有意义,则可能需要考虑从catch块返回,或者抛出另一个将由调用者捕获的异常。 例如:

    String unknown;
    try{
        unknown="cannot see me, why?";
    }catch(Exception e){
        e.printStackTrace();
        //return; // if you just want to give up with this method, but not bother breaking the flow of the caller
        throw new Exception("Uh-oh...", e); // if you want to be sure the caller knows something went wrong
    }
    System.out.println(unknown);   

您正在“尝试”设置该变量的值,该值未初始化。 这意味着如果在尝试执行该分配时捕获到异常,则分配将不会发生,并且变量将保持未初始化状态。 要摆脱错误,请将变量声明为:

String unknown = null;

这样,至少,println将能够解决问题。

在声明它时,你永远不会给出一个unknown值,甚至不是null 编译器不知道try块中发生了什么,并且不能保证内部发生任何事情。 所以,据他所知,在你的println()命中之前, unknown不会引用任何东西。

编辑:澄清一下,所有编译器都知道在try块期间的任何时候都可能抛出异常,所以它不能假设你放在那里的东西会成功。

编译器消息中的关键字可能是 这并不意味着当在println调用中访问变量时,不可能初始化变量,只是有可能它不会,因此编译器会抱怨。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM