Search code examples
javaclassoopsearch-engine

Java Exception not understood


I am writing a search engine code using java, and I'm getting this error without knowing the cause:

Exception in thread "main" java.lang.NullPointerException
    at WriteToFile.fileWriter(WriteToFile.java:29)
    at Main.main(Main.java:14)

Process finished with exit code 1

this is my code :

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;

public class Search {

   private static String URL="https://www.google.com/search?q=";
   private Document doc;
   private Elements links;
   private String html;

   public Search() throws IOException {};


   public void SearchWeb() throws IOException {

       //to get the keywords from the user

       Scanner sc = new Scanner(System.in);
       System.out.println("Please enter the keyword you want to search for: ");
       String word = sc.nextLine();


       //Search for the keyword over the net

       String url = URL + word;
       doc = Jsoup.connect(url).get();
       html = doc.html();



       Files.write(Paths.get("D:\\OOP\\OOPproj\\data.txt"), html.getBytes());

        links = doc.select("cite");


   }

   public Document getDoc() {
       return doc;
   }

   public String getHtml() {
       return html;
   }

   public Elements getLinks() {
       return links;
   }
}


and this is the class writeToFile:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;


public class WriteToFile extends Search {

    public WriteToFile() throws IOException {};

    String description = "<!> Could not fetch description <!>";
    String keywords = "<!> Could not fetch keywords <!>";
    private ArrayList<String> detail = new ArrayList<String>();
    BufferedWriter bw = null;


        public void fileWriter() throws IOException {




            for (Element link : super.getLinks()) {
                String text = link.text();
                if (text.contains("›")) {
                    text = text.replaceAll(" › ", "/");
                }

                detail.add(text);
                System.out.println(text);


            }

            System.out.println("***************************************************");

            for (int i = 0; i < detail.size(); i++)
                System.out.println("detail [" + (i + 1) + "]" + detail.get(i));

            System.out.println("###################################################################");

            for (int j = 0; j < detail.size(); j++) {
                Document document = Jsoup.connect(detail.get(j)).get();
                String web = document.html();
                Document d = Jsoup.parse(web);

                Elements metaTags = d.getElementsByTag("meta");
                for (Element metaTag : metaTags) {
                    String content = metaTag.attr("content");
                    String name = metaTag.attr("name");

                    if ("description".equals(name)) {
                        description = content;

                    }


                    if ("keywords".equals(name)) {
                        keywords = content;

                    }

                }

                String title = d.title();
                Files.write(Paths.get("D:\\OOP\\OOPproj\\search.txt"), (detail.get(j) + "\t" + "|" + "\t" + title + "\t" + "|" + "\t" + description + "\t" + "|" + "\t" + keywords + System.lineSeparator()).getBytes(), StandardOpenOption.APPEND);
            }

        }
}

This is the Main class:

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        Search a = new Search();
        a.SearchWeb(); 
        WriteToFile b = new WriteToFile();
        b.fileWriter();
    }
}

I tried to print the getLinks() method in main to check if it was null , but it wasn't , the links were cited. I would be really grateful if someone helps me out.


Solution

  • You are calling SearchWeb() on object a, but you're calling fileWriter() on object b. This means the links are set in a, but not in b.

    Since WriteToFile extends Search, you just need an instance of that:

    WriteToFile a = new WriteToFile();
    a.SearchWeb();
    a.fileWriter();