首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java如果出现故障故障的话

Java如果出现故障故障的话
EN

Stack Overflow用户
提问于 2018-05-10 02:28:57
回答 1查看 38关注 0票数 0

这是我创建的一个函数。

如您所见,这将读取搜索filename的文件,然后读取--TEMPERATURE UP--

问题是不是每个filename都有一个--TEMPERATURE UP--

我尝试使用一个else语句,但是如果我从else语句中删除break,对于没有--TEMPERATURE UP--filename,整个应用程序都会崩溃。

但是,如果我在the语句中添加一个break语句,那么每个filename都会运行the语句,即使它们包含--TEMPERATURE UP--

我也尝试过在没有!line.equals("--TEMPERATURE UP--")的情况下做一个简单的still语句,但是它仍然是一样的。

要么我必须添加break才能运行不运行if代码的else代码,要么删除运行if代码但无法运行else代码的break,因为它会崩溃。

请建议我应该如何更改代码,以便当它读取--TEMPERATURE UP--时,它将运行if代码,否则它将运行else代码。

非常感谢。

代码语言:javascript
复制
public void tempUp() {
    SharedPreferences sharedTest = getSharedPreferences("MySharedTest", Context.MODE_PRIVATE);
    String filename = sharedTest.getString("filename", " ");
    Log.d("File readed: ", filename);
    File dir = new File(path);
    File[] files = dir.listFiles();
    for (File f : files) {
        if (f.isFile()) {
            BufferedReader inputStream = null;
            try {
                inputStream = new BufferedReader(new FileReader(f));
                String lineToRead = filename;
                String CurrentLine;
                while ((CurrentLine = inputStream.readLine()) != null) {
                    if (CurrentLine.equals(lineToRead)) {
                        try
                        {
                            BufferedReader reader = new BufferedReader(new FileReader(f));
                            String line = reader.readLine();
                            while(line !=null)
                            {
                                line = reader.readLine();
                                if(line.equals("--TEMPERATURE UP--"))
                                {
                                    final String ms = reader.readLine();
                                    Log.d("temp up: ", ms);
                                    new Thread(new Runnable()
                                    {
                                        @Override
                                        public void run()
                                        {
                                            String message = "\u000704NTX" + ms + "\r";
                                            byte[] byte_array = message.getBytes();

                                            try
                                            {
                                                SharedPreferences prefx = getSharedPreferences("Device_Data", Context.MODE_PRIVATE);
                                                String device_ip = prefx.getString("local_ip", " ");
                                                String host = device_ip;
                                                Socket socket = new Socket(host, 8070);
                                                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                                                out.write(byte_array);
                                                out.flush();
                                            }
                                            catch (Exception e)
                                            {
                                            }
                                        }
                                    }).start();
                                    break;
                                }

                                else if (!line.equals("--TEMPERATURE UP--"))
                                {
                                    Toast.makeText(TestScreen.this, "There is no Temperature Display for this profile.", Toast.LENGTH_LONG).show();
                                    break;
                                }

                                }


                        }
                        catch (IOException e)
                        {
                            e.printStackTrace();
                        }



                    }

                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}

更新:

代码语言:javascript
复制
                    try
                    {
                        BufferedReader reader = new BufferedReader(new FileReader(f));
                        String line = reader.readLine();
                        boolean hasTempDisplayProfile = false;
                        while((line = reader.readLine()) !=null)
                        {

                            if(line.equals("--TEMPERATURE UP--")) {
                                hasTempDisplayProfile = true;
                                final String ms = reader.readLine();
                                Log.d("temp up: ", ms);
                                new Thread(new Runnable() {
                                    @Override
                                    public void run() {
                                        String message = "\u000704NTX" + ms + "\r";
                                        byte[] byte_array = message.getBytes();

                                        try {
                                            SharedPreferences prefx = getSharedPreferences("Device_Data", Context.MODE_PRIVATE);
                                            String device_ip = prefx.getString("local_ip", " ");
                                            String host = device_ip;
                                            Socket socket = new Socket(host, 8070);
                                            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                                            out.write(byte_array);
                                            out.flush();
                                        } catch (Exception e) {
                                        }
                                    }
                                }).start();
                                break;
                            }

                            }

                        if (hasTempDisplayProfile){
                            Toast.makeText(TestScreen.this, "There is no Temperature Display for this profile.", Toast.LENGTH_LONG).show();
                            break;
                        }

                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-10 02:52:17

您目前的实现是:

代码语言:javascript
复制
while(readLine) {
   if (line.equal("--TEMPERATURE UP--") {
     // process
   } else {
     // Toast message
   }
}

你现在看到问题了吗?问题是您正在再次测试每一行的--TEMPERATURE UP--,并在每行不匹配时显示Toast。

这是错误的。

您想要的是检查整个文件是否包含--TEMPERATURE UP--,如果是,则显示吐司。

因此,正确的实现将涉及一个标志:

代码语言:javascript
复制
boolean hasTempDisplayProfile = false;
while(readLine) {
   if (line.equal("--TEMPERATURE UP--") {
     // process
     hasTempDisplayProfile = true;
   }
}

if (!hasTempDisplayProfile) {
  // Toast message
}

编辑您的代码还有另一个严重缺陷:

代码语言:javascript
复制
String line = reader.readLine();
while(line !=null){
    line = reader.readLine();
     ... your process ...
}

在这段代码中,你读了一行。然后在while中检查行not = null。问题是,您没有使用该行,而是使用进程读取另一个line = reader.readLine()。当您到达文件结束时,它将抛出NullPointerException

改为:

代码语言:javascript
复制
String line;
while((line = reader.readLine()) !=null){
     // Do not read new line here. Just process with "line"
}

顺便说一句,您的代码需要改进。它现在有太多的缩进,这是非常令人沮丧的阅读。你可以试试:

  1. 将您的函数分解为较小的模块
  2. 使用快速失败。这不是包装您的代码,如果条件保持true,尝试返回时,false。例如,您的: 用于(文件f:文件){ if (f.isFile()) { //您的进程}}

应改为:

代码语言:javascript
复制
      for (File f: files) {
         if (!f.isFile()) {
            continue;
         }
         // Your process
      }

它减少了一层压痕。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50264613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档