【问题标题】:Cannot resolve to a variable无法解析为变量
【发布时间】:2012-04-14 16:35:37
【问题描述】:

好的,所以,我在编写这个程序时遇到了问题,这一切似乎都可以正常工作,除了最后一件事,它一直说它无法将计算解析为变量。这是我的代码。我需要让字符串计算显示在窗口上。

import java.awt.*; 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import javax.swing.*; 

public class Mover  {
    public static void main(String[] args) throws IOException, InterruptedException {   

        String usb = new File(".").getAbsolutePath();
        String user = System.getProperty("user.home") + "/Desktop";
        File TS3S = new File(usb + "/Teamspeak 3");
        File TS3D = new File(user + "/TS3");
        File MinecraftLauncherS = new File(usb + "/Minecraft");
        File MinecraftLauncherD = new File(user);
        File ShortcutS = new File(usb + "/Shortcuts");
        File ShortcutD = new File(user);
        File MinecraftFilesS = new File(usb + "/minecraft files");
        File MinecraftFilesD = new File(user + "/Application Data");

        //make sure source exists
        if(!TS3S.exists()){

           System.out.println("Directory does not exist.");
           //just exit
           System.exit(0);

        }else{

           try{
            copyFolder(TS3S,TS3D);
           }catch(IOException e){
            e.printStackTrace();
            //error, just exit
                System.exit(0);
           }
        }

        //make sure source exists
        if(!MinecraftLauncherS.exists()){

           System.out.println("Directory does not exist.");
           //just exit
           System.exit(0);

        }else{

           try{
            copyFolder(MinecraftLauncherS,MinecraftLauncherD);
           }catch(IOException e){
            e.printStackTrace();
            //error, just exit
                System.exit(0);
           }
        }

        //make sure source exists
        if(!ShortcutS.exists()){

           System.out.println("Directory does not exist.");
           //just exit
           System.exit(0);

        }else{

           try{
            copyFolder(ShortcutS,ShortcutD);
           }catch(IOException e){
            e.printStackTrace();
            //error, just exit
                System.exit(0);
           }
        }

        //make sure source exists
        if(!MinecraftFilesS.exists()){

           System.out.println("Directory does not exist.");
           //just exit
           System.exit(0);

        }else{

           try{
            copyFolder(MinecraftFilesS,MinecraftFilesD);
           }catch(IOException e){
            e.printStackTrace();
            //error, just exit
                System.exit(0);
           }
        }


        System.out.println("Done");
        Runtime.getRuntime ().exec (user + "/TS3/ts3client_win32.exe");
        System.exit(0);
        }

    public static void copyFolder(File src, File dest)
        throws IOException{

        if(src.isDirectory()){

            //if directory not exists, create it
            if(!dest.exists()){
               dest.mkdir();
               System.out.println("Directory copied from " 
                              + src + "  to " + dest);
            }

            //list all the directory contents
            String files[] = src.list();

            for (String file : files) {
               //construct the src and dest file structure
               File srcFile = new File(src, file);
               File destFile = new File(dest, file);
               //recursive copy
               copyFolder(srcFile,destFile);
            }

        }else{
            //if file, then copy it
            //Use bytes stream to support all file types
            InputStream in = new FileInputStream(src);
                OutputStream out = new FileOutputStream(dest); 

                byte[] buffer = new byte[1024];

                int length;
                //copy the file content in bytes 
                while ((length = in.read(buffer)) > 0){
                   out.write(buffer, 0, length);
                }

                in.close();
                out.close();
                System.out.println("File copied from " + src + " to " + dest);

                //read it with BufferedReader
                BufferedReader br
                    = new BufferedReader(
                        new InputStreamReader(in));

                StringBuilder sb = new StringBuilder();

                String compute;
                while ((compute = br.readLine()) != null) {
                    sb.append(compute);
                }
        }
    }
private static void createWindow() {

   //Create and set up the window. 
   JFrame a = new JFrame("Processing....");
   a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

   JLabel b = new JLabel(compute,SwingConstants.CENTER); 
   b.setPreferredSize(new Dimension(300, 100)); 
   a.getContentPane().add(b, BorderLayout.CENTER); 

   //Display the window. 
   a.setLocationRelativeTo(null); 
   a.pack();
   a.setVisible(true); 
}

public static void window(String[] args) {

   createWindow();

}

}

【问题讨论】:

    标签: java string variables stream


    【解决方案1】:

    在这一行:

    JLabel b = new JLabel(compute,SwingConstants.CENTER); 
    

    计算未声明!!!

    【讨论】:

    • 取决于你想要什么。您可以尝试从全局声明它开始。然后你可以随时在方法copyFolder中修改它。
    • 所以要全局声明我需要添加什么?
    【解决方案2】:

    您在 copyFolder() 函数中将 compute 声明为局部变量,但在 createWindow 函数中使用它,因此它超出了 createWindow 函数的范围

    您可以将其设为类级别的变量并新建一个类以获取实例,而不是静态访问方法

    public class Mover  {
    
        //make it public if you want to access it directly from an instance (object)
        //of this class (myMover), else keep it private - it will be accessible only
        //in this class
        //you could also make it static but that will have limitations (can be accessed
        //only from static functions and value will be shared by all objects of this class
        public String compute;
    
        public static void main(String[] args) throws IOException, InterruptedException {   
           //an object of this class needs to be created only if compute is non-static
           Mover myMover = new Mover();
    
           //access compute variable using myMover.compute
    
           // invoke your methods using myMover.copyFolder() etc
        }
    }
    

    【讨论】:

    • 我该怎么做呢?我对这门语言还比较陌生,所以我需要一些示例代码。
    • 我不能只添加静态字符串计算;在公共课 Mover { ? 之后
    • 是的,你可以,但你必须小心。它变成了一个类级别的变量,而不是实例(对象)级别的变量,并且只有静态方法可以访问静态变量,所以你最终可能会出现意大利面条式的代码。另请注意,如果您有 2 个 Mover 对象实例,它们将共享相同的计算变量 - 您可能不希望这样
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2012-02-29
    • 2020-12-07
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多