2014-04-29 114 views
0

我尝试运行这在我的根目录文件夹Java中的StringIndexOutOfBoundsException?

import java.io.DataOutputStream; 
import java.io.File; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Scanner; 

public class WebServer { 

    static ServerSocket requestListener; 
    static Socket requestHandler; 
    static Scanner requestReader, pageReader; 
    static DataOutputStream pageWriter; 
    static String HTTPMessage; 
    static String requestedFile; 
    public static int HTTP_PORT = 12346; 

    public static void main(String[] args) { 

     try { 

      requestListener = new ServerSocket(HTTP_PORT); 

      System.out.println("Waiting For IE to request a page:"); 
      requestHandler = requestListener.accept(); 
      System.out.println("Page Requested: Request Header:"); 

      requestReader = new Scanner(new InputStreamReader(
        requestHandler.getInputStream())); 
//THis is the part where its throwing the error 

      int lineCount = 0; 
      do { 

       lineCount++; // This will be used later 
       HTTPMessage = requestReader.next(); 
       System.out.println(HTTPMessage); 
       if (lineCount == 1) { 
        requestedFile = "WebRoot\\" 
          + HTTPMessage.substring(5, 
            HTTPMessage.indexOf("HTTP/1.1") - 1); 
        requestedFile = requestedFile.trim(); 
       } 

       // localhost:12346/default.htm 
       // HTTPMessage = requestReader.nextLine(); 
       pageReader = new Scanner(new File(requestedFile)); 
       pageWriter = new DataOutputStream(
         requestHandler.getOutputStream()); 
       while (pageReader.hasNext()) { 
        String s = pageReader.nextLine(); 
        // System.out.println(s); 
        pageWriter.writeBytes(s); 
       } 
       // Tells the Browser we’re done sending 
       pageReader.close(); 
       pageWriter.close(); 
       requestHandler.close(); 

      } while (HTTPMessage.length() != 0); 
     } catch (Exception e) { 

      System.out.println(e.toString()); 
      System.out.println("\n"); 
      e.printStackTrace(); 
     } 
    } 
} 

返回网页这个java程序,我得到这个错误信息。我应该在IE中获得一个网页,但我得到这个错误信息。

等待对于IE请求的页面:

Page Requested: Request Header: 
GET 
    java.lang.StringIndexOutOfBoundsException: String index out of range: -7 
     at java.lang.String.substring(Unknown Source) 
     at WebServer.main(WebServer.java:39) 
+0

您是在问'StringIndexOutOfBounds'代表什么,或者为什么代码抛出此异常?简短的回答是,你的代码正在引用一个索引为“-7”的字符串,并且你需要调试发生了什么。它发生在这里的任何机会:'HTTPMessage.indexOf(“HTTP/1.1”) - 1)' - 你检查了进入这个代码的响应吗?好像你期望找到那个子字符串,它实际上并不在输入中? – jefflunt

+0

我试图从http头中提取请求的页面标题 – null

回答

1

此错误被抛出,因为字符串 'HTTPMessage' 不包含字符串 'HTTP/1.1'。因此

HTTPMessage.indexOf("HTTP/1.1") => returns -1 

所以yoour子功能这里面是什么获得通过:

HTTPMessage.substring(5, -2); 

因此,错误。

要解决此错误,您应该先尝试检查HTTPMessage是否包含所需的字符串,然后尝试计算子字符串。进行以下更改:

if (lineCount == 1 && HTTPMessage.indexOf("HTTP/1.1") != -1) { 
       requestedFile = "WebRoot\\" 
         + HTTPMessage.substring(5, 
           HTTPMessage.indexOf("HTTP/1.1") - 1); 
       requestedFile = requestedFile.trim(); 
    } 
相关问题