2016-01-31 33 views
-2

我是java中異常處理的新手。 我只是想清除我的概念,但我遇到了以下問題。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 
+0

爲什麼JVM是不是能找到符 '我'? – asad

+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出來的內部範圍的

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); 
} 
0

那是因爲我的範圍是中庸之道的嘗試塊。

0

變量i是在try塊內部定義的,它限制了try塊內部的範圍。您需要在try塊外定義它。

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); 
    } 
} 

這樣一來,可變i是在同一範圍內println聲明。

0

Java是一個範圍內的語言,因此變量的可見性取決於它定義的位置。

在計算機編程中,名稱綁定的範圍 - 名稱與實體(如變量)的關聯 - 是綁定有效的計算機程序的一部分:可以使用名稱的位置指實體。 Java是在詞彙範圍內的。

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

因爲你string i在try塊中聲明,println方法是無法找到它。 (它超出範圍

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中,只要在同一組括號或括號內的任何括號內定義變量,就可以訪問變量。

在你的情況,以便儘快確定try塊中的變量i作爲try塊完成變量不再可見,因此不能用你的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); 
    } 

一切順利:)