java - 压缩类错误 - 线程异常 "main"java.lang.StringIndexOutOfBoundsException : String index out of range: -1

标签 java networking tcp compression

我已经为客户端服务器 TCP 数据连接创建了这个简单的压缩类,它在我看来一切正常,没有构建错误,但是我遇到了一个我无法更正的运行时错误。我得到的错误是线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:-1。

代码:

import java.io.Serializable;
import java.util.ArrayList;

public class CompressedMessage implements Serializable
{   // this instance variable will store the original, compressed and decompressed message
    private String message;

    public CompressedMessage(String message)
    {   
        // begin by coding this method first - initialise instance variable message with the original message
        this.message = message;
    }

    public String getMessage()
    {   
        return this.message;

    }

    private boolean punctuationChar(String str)
    {   
        // Hint: check if the last character in the string is a punctuation
        int length = str.length();
        str = str.substring(length -2,length-1);

        if(str.equals(",") || str.equals("!") || str.equals(".") || str.equals("?"))
        {
            return true;
        }
        else
        {
            return false;
        }

    }

    private String getWord(String str)
    {   // Hint: if last character in string is punctuation then remove 

    if(punctuationChar(str)== true)
    {
        //remove punctuation of last char
        str = str.substring(0,str.length()-1);
    }

        return str;
    }


    public void compress()
    {   /* read through section 3 of the practical 5 document 
           to get you started. This is called by the server, 
           have a look at the server code where it is called */ 
        ArrayList<String> newMessage = new ArrayList<String>();


        String[] words = message.split(" ");  

        for (String word : words)  
        {  
            getWord(word);
            //if word has already appeared replace with position of previous word
            if(newMessage.contains(word))
            {
                String str = Integer.toString(newMessage.indexOf(word));
                str = str + " ";
                newMessage.add(str);
            }
            else
            {
                word = word + "";
                newMessage.add(word);
            }

         //if word had a punctuation at the end add it back in
         //System.out.println(word);  
        }  

            this.message = newMessage.toString();
            System.out.println("****************COMPRESSING*****************");
            System.out.println(newMessage);

    }

    public void decompress()
    {   /* read through section 3 of the practical 5 document 
           to get you started. This is called by the client,
           have a look at the client code where it is called */
           ArrayList<String> decompMessage = new ArrayList<String>();

           String[] words = message.split(" ");


           for (String word : words)  
        {  
            getWord(word);

            if(word.substring(0,1).matches("[0-9]"))
            {
              int num = Integer.parseInt(word);
              decompMessage.add(decompMessage.get(num));

            }
            else
            {
                decompMessage.add(word);
            }
        }

        this.message = decompMessage.toString();
        System.out.println("****************DECOMPRESSING*****************");
            System.out.println(decompMessage);  

    }
}

错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1952)
    at CompressedMessage.punctuationChar(CompressedMessage.java:24)
    at CompressedMessage.getWord(CompressedMessage.java:40)
    at CompressedMessage.compress(CompressedMessage.java:61)
    at P5_Server.waitForData(P5_Server.java:72)
    at P5_Server.main(P5_Server.java:159)

我已经尝试更改基于 length() 计算字符串的方式,但它并没有减少错误。

谁能看出我做错了什么?

最佳答案

如果您的 strlength 0(空字符串)或 length 1 怎么办?在那种情况下 str = str.substring(length -2,length-1); 将导致异常。

您需要在执行子字符串之前进行长度检查:

    if(length > 1){
        str = str.substring(length-2,length-1);
    }

因为你只想获得一个角色,我认为你可以简单地这样做:

    if(length > 1){
        str = String.valueOf(str.charAt(length-2))
    }

请确保 str 不为空,否则也进行空处理。

关于java - 压缩类错误 - 线程异常 "main"java.lang.StringIndexOutOfBoundsException : String index out of range: -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13310379/

相关文章:

java - java套接字连接被拒绝?

php - 从网页到android应用程序的tcp连接

Java:多个数组

Java Quartz Spring 事务支持

iphone - 如何控制 iPhone 上的网络事件指示器

c - 基本 C 服务器 : Connection Refused Error

C++: Cloud computing library: 有这样一个库,我不需要写太多网络的东西吗?

java - 在java中生成函数参数

java - ContentResolver 删除

c++ - boost::asio::tcp 套接字上的双向通信