什么';这是Java的交易';在本例中,返回类型为

什么';这是Java的交易';在本例中,返回类型为,java,Java,我不断得到方法必须返回byte[]类型的结果 public class MyClass { public static byte[] someMethod() { try { ... byte[] someByte = .... ; return someByte; } catch (Exception e) { e.printStackTrace(); } retur

我不断得到
方法必须返回byte[]类型的结果

public class MyClass {

  public static byte[] someMethod() {
    try {
        ...
        byte[] someByte = .... ;            
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
   }    
}

如果存在
try/catch
块,我如何正确返回某些内容?

这不会编译,因为
someByte
在try块内声明,并在try块外访问

应该是:

public class MyClass {
  public static byte[] someMethod() {
    byte[] someByte = null;
    try {
        ...
        someByte = .... ;            
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
  }    
}

这不会编译,因为
someByte
在try块内声明,并在try块外访问

应该是:

public class MyClass {
  public static byte[] someMethod() {
    byte[] someByte = null;
    try {
        ...
        someByte = .... ;            
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
  }    
}

在try/catch块的范围之外声明
someByte
,以便它在方法的更大范围内可见

byte[] someByte = null;
try {
    someByte = .... ;            
} catch (Exception e) {
    e.printStackTrace();
} 
return someByte;

在try/catch块的范围之外声明
someByte
,以便它在方法的更大范围内可见

byte[] someByte = null;
try {
    someByte = .... ;            
} catch (Exception e) {
    e.printStackTrace();
} 
return someByte;

要正确返回某个内容,必须在
try{}
范围之外声明它,并在其中初始化(如果这需要包含
try{}
)。例如:-

public class MyClass {

  public static byte[] someMethod() {
    byte[] someByte =null;
       try {
        ...
        someByte = .... ;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
   }    
}

要正确返回某个内容,必须在
try{}
范围之外声明它,并在其中初始化(如果这需要包含
try{}
)。例如:-

public class MyClass {

  public static byte[] someMethod() {
    byte[] someByte =null;
       try {
        ...
        someByte = .... ;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
   }    
}

byte[]someByte
移出try块

public class MyClass {

      public static byte[] someMethod() {
        byte[] someByte = .... ;
        try {
            ...
            byte[] someByte = .... ;            
            return someByte;
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return someByte;
       }    
    }

byte[]someByte
移出try块

public class MyClass {

      public static byte[] someMethod() {
        byte[] someByte = .... ;
        try {
            ...
            byte[] someByte = .... ;            
            return someByte;
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return someByte;
       }    
    }

您的数组
someByte
超出范围

public class MyClass {

  public static byte[] someMethod() {
    try {
        ...
        byte[] someByte = .... ;            // scope begins        
        return someByte;                    // scope ends
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;                        // out of scope
   }    
}
而是这样做

public class MyClass {

  public static byte[] someMethod() {
    byte[] someByte = null ;         // scope begins
    try {          
        someByte = .... ;         
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;                // scope ends
   }    
}

您的数组
someByte
超出范围

public class MyClass {

  public static byte[] someMethod() {
    try {
        ...
        byte[] someByte = .... ;            // scope begins        
        return someByte;                    // scope ends
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;                        // out of scope
   }    
}
而是这样做

public class MyClass {

  public static byte[] someMethod() {
    byte[] someByte = null ;         // scope begins
    try {          
        someByte = .... ;         
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;                // scope ends
   }    
}

这里是变量的范围在图中,变量的范围基本上是代码区域或代码中可以使用相同值访问变量的行数

所以这里您在try块内声明了somebyte[],变量的作用域仅在花括号内,并且它仅在该块内可见,因为您在块内声明了它,所以当您尝试从块外获取变量的值时,将不会得到预期的结果

       try {
    ...
    byte[] someByte = .... ;            
    return someByte;
    } catch (Exception e) {
    e.printStackTrace();
     } 
因此,在块外声明它,以便变量对您可以访问它的代码行可见


您将其声明在块内,这样它的生存期和作用域也在块内。

这里是变量的作用域。在图片中,变量的作用域基本上是代码区域或代码中可以使用相同值访问变量的行数

所以这里您在try块内声明了somebyte[],变量的作用域仅在花括号内,并且它仅在该块内可见,因为您在块内声明了它,所以当您尝试从块外获取变量的值时,将不会得到预期的结果

       try {
    ...
    byte[] someByte = .... ;            
    return someByte;
    } catch (Exception e) {
    e.printStackTrace();
     } 
因此,在块外声明它,以便变量对您可以访问它的代码行可见


您在块内声明它,因此它的生存期和作用域也在块内。

正如其他人所说,您必须在try/catch块外声明
someByte
。然而,解释一下原因可能是有用的

try/catch块的try部分是在没有抛出异常的正常操作期间执行的部分。如果在执行try块期间引发异常,则执行将立即停止。从那里开始,执行将在相应的catch块中继续(如果找到合适的块)。简单地说,这就像是简单地删除了未使用的代码,然后catch块中的代码替换了它

编译器检查可能由自修改代码引起的问题。虽然在您的示例中,
someByte
可能不会被声明,但编译器无法确定它不会被声明。它无法预测是否会在之前引发异常

byte[] someByte = .... ;
它正在考虑发生这种情况的可能性:

public class MyClass {

  public static byte[] someMethod() {
        ...    // Exception thrown somewhere here
        byte[] someByte = .... ;            
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
   }    
}
这意味着,从本质上讲,JVM的作用是:

public class MyClass {

  public static byte[] someMethod() {
        ...    // Exception thrown somewhere here
        e.printStackTrace();
        return someByte;
  }    
}
如果您只是在源文件中键入了这个,那么您会看到一个明显的问题,即返回一个根本不存在的变量


通过在try块之外声明变量,您可以100%确保使用正确的数据类型声明变量,因此您和编译器知道将返回一些内容,即使它只是变量的默认值。如果愿意,您仍然可以在try/catch块内更改变量的值。

正如其他人所说,您必须在try/catch块外声明
someByte
。然而,解释一下原因可能是有用的

try/catch块的try部分是在没有抛出异常的正常操作期间执行的部分。如果在执行try块期间引发异常,则执行将立即停止。从那里开始,执行将在相应的catch块中继续(如果找到合适的块)。简单地说,这就像是简单地删除了未使用的代码,然后catch块中的代码替换了它

编译器检查可能由自修改代码引起的问题。虽然在您的示例中,
someByte
可能不会被声明,但编译器无法确定它不会被声明。它无法预测是否会在之前引发异常

byte[] someByte = .... ;
它正在考虑发生这种情况的可能性:

public class MyClass {

  public static byte[] someMethod() {
        ...    // Exception thrown somewhere here
        byte[] someByte = .... ;            
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
   }    
}
这意味着,从本质上讲,JVM的作用是:

public class MyClass {

  public static byte[] someMethod() {
        ...    // Exception thrown somewhere here
        e.printStackTrace();
        return someByte;
  }    
}
如果您只是在源文件中键入了这个,那么您会看到一个明显的问题,即返回一个根本不存在的变量


通过在try块之外声明变量,您可以100%确保使用正确的数据类型声明变量,因此您和编译器知道将返回一些内容,即使它只是变量的默认值。如果愿意,您仍然可以在try/catch块中更改变量的值。

您没有考虑作用域。你的las