2014-04-29 115 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(); 
    } 
相關問題