title: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo [java]
body: <p>Good day, an error occurs when you start the app: </p>
  
  <blockquote>
    <p>03-09 16:51:36.537 24639-24639/? E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.webserver, PID: 24639
        java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.webserver/com.example.webserver.MainActivity}: java.lang.InstantiationException: java.lang.Class has no zero argument constructor
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2515)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2670)
            at android.app.ActivityThread.access$1100(ActivityThread.java:178)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1515)
            at android.os.Handler.dispatchMessage(Handler.java:111)
            at android.os.Looper.loop(Looper.java:207)
            at android.app.ActivityThread.main(ActivityThread.java:5845)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:768)
         Caused by: java.lang.InstantiationException: java.lang.Class has no zero argument constructor
            at java.lang.Class.newInstance(Native Method)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1072)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2505)</p>
  </blockquote>
  
  <p>I'm trying to make a web server on Android.
  Here's the code:</p>
  
  <pre><code>    package com.example.webserver;
  
  import androidx.appcompat.app.AppCompatActivity;
  
  import java.io.BufferedOutputStream;
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileNotFoundException;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.io.OutputStream;
  import java.io.PrintWriter;
  import java.net.ServerSocket;
  import java.net.Socket;
  import java.util.Date;
  import java.util.StringTokenizer;
  
  // The tutorial can be found just here on the SSaurel's Blog :
  // https://www.ssaurel.com/blog/create-a-simple-http-web-server-in-java
  // Each Client Connection will be managed in a dedicated Thread
  public class MainActivity implements Runnable {
  
      static final File WEB_ROOT = new File(".");
      static final String DEFAULT_FILE = "index.html";
      static final String FILE_NOT_FOUND = "404.html";
      static final String METHOD_NOT_SUPPORTED = "not_supported.html";
      // port to listen connection
      static final int PORT = 8080;
  
      // verbose mode
      static final boolean verbose = true;
  
      // Client Connection via Socket Class
      private Socket connect;
  
      public MainActivity(Socket c) {
          connect = c;
      }
  
      public static void main(String[] args) {
          try {
              ServerSocket serverConnect = new ServerSocket(PORT);
              System.out.println("Server started.\nListening for connections on port : " + PORT + " ...\n");
  
              // we listen until user halts server execution
              while (true) {
                  MainActivity myServer = new MainActivity(serverConnect.accept());
  
                  if (verbose) {
                      System.out.println("Connecton opened. (" + new Date() + ")");
                  }
  
                  // create dedicated thread to manage the client connection
                  Thread thread = new Thread(myServer);
                  thread.start();
              }
  
          } catch (IOException e) {
              System.err.println("Server Connection error : " + e.getMessage());
          }
      }
  
      @Override
      public void run() {
          // we manage our particular client connection
          BufferedReader in = null; PrintWriter out = null; BufferedOutputStream dataOut = null;
          String fileRequested = null;
  
          try {
              // we read characters from the client via input stream on the socket
              in = new BufferedReader(new InputStreamReader(connect.getInputStream()));
              // we get character output stream to client (for headers)
              out = new PrintWriter(connect.getOutputStream());
              // get binary output stream to client (for requested data)
              dataOut = new BufferedOutputStream(connect.getOutputStream());
  
              // get first line of the request from the client
              String input = in.readLine();
              // we parse the request with a string tokenizer
              StringTokenizer parse = new StringTokenizer(input);
              String method = parse.nextToken().toUpperCase(); // we get the HTTP method of the client
              // we get file requested
              fileRequested = parse.nextToken().toLowerCase();
  
              // we support only GET and HEAD methods, we check
              if (!method.equals("GET")  &amp;&amp;  !method.equals("HEAD")) {
                  if (verbose) {
                      System.out.println("501 Not Implemented : " + method + " method.");
                  }
  
                  // we return the not supported file to the client
                  File file = new File(WEB_ROOT, METHOD_NOT_SUPPORTED);
                  int fileLength = (int) file.length();
                  String contentMimeType = "text/html";
                  //read content to return to client
                  byte[] fileData = readFileData(file, fileLength);
  
                  // we send HTTP Headers with data to client
                  out.println("HTTP/1.1 501 Not Implemented");
                  out.println("Server: Java HTTP Server from SSaurel : 1.0");
                  out.println("Date: " + new Date());
                  out.println("Content-type: " + contentMimeType);
                  out.println("Content-length: " + fileLength);
                  out.println(); // blank line between headers and content, very important !
                  out.flush(); // flush character output stream buffer
                  // file
                  dataOut.write(fileData, 0, fileLength);
                  dataOut.flush();
  
              } else {
                  // GET or HEAD method
                  if (fileRequested.endsWith("/")) {
                      fileRequested += DEFAULT_FILE;
                  }
  
                  File file = new File(WEB_ROOT, fileRequested);
                  int fileLength = (int) file.length();
                  String content = getContentType(fileRequested);
  
                  if (method.equals("GET")) { // GET method so we return content
                      byte[] fileData = readFileData(file, fileLength);
  
                      // send HTTP Headers
                      out.println("HTTP/1.1 200 OK");
                      out.println("Server: Java HTTP Server from SSaurel : 1.0");
                      out.println("Date: " + new Date());
                      out.println("Content-type: " + content);
                      out.println("Content-length: " + fileLength);
                      out.println(); // blank line between headers and content, very important !
                      out.flush(); // flush character output stream buffer
  
                      dataOut.write(fileData, 0, fileLength);
                      dataOut.flush();
                  }
  
                  if (verbose) {
                      System.out.println("File " + fileRequested + " of type " + content + " returned");
                  }
  
              }
  
          } catch (FileNotFoundException fnfe) {
              try {
                  fileNotFound(out, dataOut, fileRequested);
              } catch (IOException ioe) {
                  System.err.println("Error with file not found exception : " + ioe.getMessage());
              }
  
          } catch (IOException ioe) {
              System.err.println("Server error : " + ioe);
          } finally {
              try {
                  in.close();
                  out.close();
                  dataOut.close();
                  connect.close(); // we close socket connection
              } catch (Exception e) {
                  System.err.println("Error closing stream : " + e.getMessage());
              }
  
              if (verbose) {
                  System.out.println("Connection closed.\n");
              }
          }
  
  
      }
  
      private byte[] readFileData(File file, int fileLength) throws IOException {
          FileInputStream fileIn = null;
          byte[] fileData = new byte[fileLength];
  
          try {
              fileIn = new FileInputStream(file);
              fileIn.read(fileData);
          } finally {
              if (fileIn != null)
                  fileIn.close();
          }
  
          return fileData;
      }
  
      // return supported MIME Types
      private String getContentType(String fileRequested) {
          if (fileRequested.endsWith(".htm")  ||  fileRequested.endsWith(".html"))
              return "text/html";
          else
              return "text/plain";
      }
  
      private void fileNotFound(PrintWriter out, OutputStream dataOut, String fileRequested) throws IOException {
          File file = new File(WEB_ROOT, FILE_NOT_FOUND);
          int fileLength = (int) file.length();
          String content = "text/html";
          byte[] fileData = readFileData(file, fileLength);
  
          out.println("HTTP/1.1 404 File Not Found");
          out.println("Server: Java HTTP Server from SSaurel : 1.0");
          out.println("Date: " + new Date());
          out.println("Content-type: " + content);
          out.println("Content-length: " + fileLength);
          out.println(); // blank line between headers and content, very important !
          out.flush(); // flush character output stream buffer
  
          dataOut.write(fileData, 0, fileLength);
          dataOut.flush();
  
          if (verbose) {
              System.out.println("File " + fileRequested + " not found");
          }
      }
  
  }
  </code></pre>