java中的以下代码有什么问题

时间:2016-01-31 09:03:48

标签: java compiler-errors cannot-find-symbol

我是java中异常处理的新手。 我只是想清除我的概念,但我遇到了以下问题。

这是代码。

class Inn {
    public static void main(String... args) {
        try{
            String i="Asd";
        } catch(Exception e) {
            System.out.println(e);
        }
        //i=7;
        System.out.println(i);
    }
}

这就是即将发生的错误。

G:\javap>javac Inn.java
Inn.java:13: error: cannot find symbol
                System.out.println(i);
                                   ^
  symbol:   variable i
  location: class Inn
1 error

6 个答案:

答案 0 :(得分:2)

try { // Block A
    String i="Asd"; 
} // End of Block A
catch(Exception e) {
    System.out.println(e);
}

System.out.println(i); // 'i' does not exist in this scope

变量i在代码块A 中声明,这意味着它只能从内部访问(注意限制其范围的{花括号})。一旦执行流程经过块A ,变量i将不再存在于范围内。

话虽如此,如果你想做这项工作,你必须声明内部范围的字符串i out

String i = ""; // necessary initialization, without it you'll get a
               // "variable may have not been initialized" error
try { 
    i = "Asd"; 
}
catch(Exception e) {
    System.out.println(e);
}

答案 1 :(得分:1)

i变量在不同的范围内定义,并且在您尝试打印时不可见。

重写为:

import java.io.*;
class Inn
{
    public static void main(String s[])
    {
        String i = null;
        try{
            i="Asd";
        }catch(Exception e)
        {
            System.out.println(e);
        }
        //i=7;
        System.out.println(i);
    }
}

这样,变量iprintln语句的范围相同。

答案 2 :(得分:1)

对于大多数编程语言,通常会将范围与变量相关联。范围在外行术语中的含义是 - 可以使用变量的代码部分或变量可见的部分。

使用Java(或许多OOP语言)我们通常有各种级别的范围

  1. 类级别范围:类中定义的变量,即成员变量可以在类中的任何位置访问(为了简单起见,我将静态修饰符保留在图片之外)。这些变量通常定义在类的顶部(约定​​)。请记住,这些变量需要在类的方法之外才能在类级别范围内。

    public class Example {
        private String a; // variable a can be accessed anywhere inside the class
    }
    
  2. 方法级别范围:方法中定义的变量只能在方法内部访问。它们的生命周期在方法返回时结束。

     private int giveMeFive(){
        int a = 5; // Scope of a is within the method
        return a; // When a is returned then there the variable a dies :(
    }
    
  3. 循环级别范围:您在循环中定义的变量仅限于该循环和任何内部循环。它们不能在定义它们的循环之外访问。

     public static void main(String []args){
        for(int i=0;i<10;i++){
            System.out.println(i); // Only i is accessible here but not j
            for(int j=1;j<5;j++){
                System.out.println(i+j); // Both i and j are accessible here
            }
        }
     }
    
  4. 块级别范围:通常,大括号{}内的任何内容都定义了特定的范围。在Java中,只要在同一组括号中或在这些括号内的任何括号中定义变量,您通常都可以访问该变量。

  5. 在您的情况下,您在try块中定义了变量i,因此一旦try块完成,变量就不再是 visible ,因此以后的println语句无法找到它在代码中。

         public static void main(String[] args){
             String i; // i defined outside the try block so it can be accessed after the try finished running
             try{
                 i= "Asd"
             }catch(Exception e){
                 Sytem.out.println(e);
             }
             System.out.println(i);
         }
    

    一切顺利:)

答案 3 :(得分:0)

这是因为i的范围在try块中是juste。

答案 4 :(得分:0)

变量i在try块内定义,它限制了try块内的i的范围。您需要在try块之外定义它。

答案 5 :(得分:0)

Java是一种范围内的语言,因此变量的可见性取决于它的定义位置。

  

在计算机编程中,名称绑定的范围 - 名称与实体的关联,例如变量 - 是绑定有效的计算机程序的一部分:名称可用于引用实体。   Java是词法范围的。

Problem with "scopes" of variables in try catch blocks in Java

由于您在try块中声明了products = {} fi = open("prod_file.txt","r") for line in fi: l = line.rstrip().split(":") products[l[0]] = {"desc" : l[1], "price" : l[2], "stock" : int(l[3]), "reorder" : int(l[4]), "target" : int(l[5])} fi.close gtin_valid() cont=False while not cont: quantity=input("enter qty: ") if quantity.isdigit(): qty=[quantity] gtin8=[gtin] qty.append(quantity) gtin8.append(gtin) carryon=input("do you want to continue? ") if carryon[0]=="n": cont=True print(qty,gtin8) else: gtin_valid() quantity=input("enter qty: ") else: print("Please enter numbers only ") gtin_valid() quantity=input("enter qty: ") ,因此println方法无法找到它。 (超出范围