Java:如何访问 try-catch 循环中的赋值?

问题描述 投票:0回答:5

这个问题让我陷入了巨大的 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);
 }
}
java compiler-construction variable-assignment
5个回答
10
投票

您需要为

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
是否会被赋值,因此您可能可以使用没有赋值的变量。


4
投票

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

在使用变量之前,您需要将其分配给某些东西。 但是,如果您希望在分配失败时它为 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);   

3
投票

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

String unknown = null;

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


2
投票

当你声明它时,你永远不会给

unknown
一个值,甚至是
null
。 编译器不知道
try
块中发生了什么,也不能保证内部发生任何事情。 因此,据其所知,在您的
unknown
击中之前,
println()
并未引用任何内容。

编辑:为了澄清,编译器所知道的是,在

try
块期间的任何点都可能抛出异常,因此它不能假设您放入其中的内容会成功。


1
投票

编译器消息中的关键词是 might。这并不意味着在

println
调用中访问变量时该变量不可能被初始化,只是有可能不会被初始化,因此编译器会抱怨。

© www.soinside.com 2019 - 2024. All rights reserved.